Skip to content

feat: support iOS and iPadOS 17.4 - #104

Merged
ykisana merged 1 commit into
mainfrom
ios17-support
Nov 14, 2026
Merged

ykisana merged 1 commit into
mainfrom
ios17-support

Conversation

@ykisana

@ykisana ykisana commented Nov 14, 2026 •

Copy link
Copy Markdown
Contributor

Lowers the minimum from iOS 18.0 to 17.4. Normal can then be installed on the three iPads that stop at iPadOS 17 (iPad 6th gen, iPad Pro 10.5", iPad Pro 12.9" 2nd gen) and on devices that haven't updated past iOS 17.

Changes

  • Deployment target is 17.4 for every target. 17.4 rather than 17.0 because Max Daily Limits uses DeviceActivityEvent(...includesPastActivity:), which needs 17.4. Every device on 17.0–17.3 can update to 17.7.
  • MainTabView and SettingsView keep Tab on iOS 18 and later, line for line as on main. Tab needs iOS 18, so the else branch builds the same tabs with .tabItem and .tag for iOS 17.
  • Control Center controls need iOS 18. The control types are marked @available(iOS 18.0, *), the widget bundle only registers them there, and reloadAllControls() is guarded.

Nothing changes on iOS 18 and later.

What iOS 17 doesn't get

  • Control Center controls (Block All, Block Group).
  • Unblock shortcuts with an NFC or QR key don't open Normal on their own. They show "Open Normal to unblock.", as on iOS 18.0 and 18.1 today. Location keys are unaffected.

Testing

  • iOS 17.5, iPhone 15: 873 unit tests and all UI tests pass (37, with the orientation launch tests skipped). An earlier revision with the same iOS 17 tab code also passed on iPad (10th gen).
  • iOS 27.0: the 14 UI tests that go through Settings pass.
  • The app and widget binaries have a 17.4 minimum, and the iOS 18- and 26-only symbols they import are weak-linked.
  • A SwiftData store holding every model, written on iOS 17.5, opens and re-saves on 18.6, 26.5 and 27.0.
  • Not run on a real iPadOS 17 device. The simulator can't check blocking, schedules firing while the app is closed, daily limits, the website filter, hiding apps, the widget or the Live Activity, so this needs a TestFlight pass on one before release.

@ykisana
ykisana force-pushed the ios17-support branch 2 times, most recently from cc85381 to 892fb68 Compare November 14, 2026 07:29
The minimum was iOS 18.0, which left out the three iPads that stop at
iPadOS 17 (iPad 6th gen, iPad Pro 10.5", iPad Pro 12.9" 2nd gen) and
anyone still on iOS 17.

- Deployment target is 17.4 for every target. 17.4, not 17.0, because
  Max Daily Limits needs DeviceActivityEvent's includesPastActivity.
- The main and Settings tab bars keep Tab on iOS 18 and later. On
  iOS 17, which doesn't have Tab, the else branch builds the same tabs
  with tabItem and tag.
- Control Center controls need iOS 18, so they are only registered and
  reloaded there.

On iOS 17 there are no Control Center controls, and the Unblock
shortcuts with an NFC or QR key say "Open Normal to unblock." instead
of opening Normal, as on iOS 18.0 and 18.1.
@ykisana
ykisana merged commit 8739040 into main Nov 14, 2026
2 checks passed
@ykisana
ykisana deleted the ios17-support branch November 14, 2026 09:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant